* lisp/emacs-lisp/comp-cstr.el (comp-cstr-type-p): New function.
authorAndrea Corallo <acorallo@gnu.org>
Wed, 10 Apr 2024 16:15:12 +0000 (18:15 +0200)
committerAndrea Corallo <acorallo@gnu.org>
Wed, 10 Apr 2024 16:16:26 +0000 (18:16 +0200)
lisp/emacs-lisp/comp-cstr.el

index 73d445eb3f4283b0296fd2a6ccca7f9261fde2b1..5a3b7b48cc49e6b0bd9cedf7e513a182f1d08afe 100644 (file)
@@ -941,6 +941,17 @@ Non memoized version of `comp-cstr-intersection-no-mem'."
          (null (neg cstr))
          (equal (typeset cstr) '(cons)))))
 
+(define-inline comp-cstr-type-p (cstr type)
+  "Return t if CSTR is certainly of type TYPE."
+  (if-let ((pred (get type 'cl-deftype-satisfies)))
+      (with-comp-cstr-accessors
+        (and (null (range cstr))
+             (null (neg cstr))
+             (and (or (null (typeset cstr))
+                      (equal (typeset cstr) `(,type)))
+                  (cl-every pred (valset cstr)))))
+    (error "Unknown predicate for type %s" type)))
+
 ;; Move to comp.el?
 (defsubst comp-cstr-cl-tag-p (cstr)
   "Return non-nil if CSTR is a CL tag."